// 第 2 步：声明 Logger 类及成员

#pragma once

#include "lf_queue.hpp"
#include <cstdint>
#include <cstdio>
#include <string>
#include <thread>
#include <fstream>

namespace Common {
// step 1:
// 首先写好头文件的基本结构、依赖、命名空间，以及日志元素 LogElement 的定义。
// 它使用 enum class LogType 标记数据类型，内部通过 union 存放不同原生类型的值。
constexpr size_t LOG_QUEUE_SIZE = 8 * 1024 * 1024;

enum class LogType : int8_t {
  CHAR = 0,
  INTEGER,
  LONG_INTEGER,
  LONG_LONG_INTEGER,
  UNSIGNED_INTEGER,
  UNSIGNED_LONG_INTEGER,
  UNSIGNED_LONG_LONG_INTEGER,
  FLOAT,
  DOUBLE
};

struct LogElement {
  LogType type_ = LogType::CHAR;
  union {
    char c;
    int i;
    long l;
    long long ll;
    unsigned u;
    unsigned long ul;
    unsigned long long ull;
    float f;
    double d;
  } u_;
};

// step 2:
// 接着列出类的大致框架，包括构造、析构、后台线程逻辑 flushQueue()，以及核心成员变量（文件流、队列、线程指针等）
class Logger final {
public:
  auto flushQueue() noexcept;
  explicit Logger(const std::string &file_name);
  ~Logger();

  auto pushValue(const LogElement &log_element) noexcept;

  // ...后面还会补充 pushValue 的重载与 log() 接口...

  Logger() = delete;
  Logger(const Logger &) = delete;
  Logger(const Logger &&) = delete;
  Logger &operator=(const Logger &) = delete;
  Logger &operator=(const Logger &&) = delete;

private:
  const std::string file_name_;
  std::ofstream file_;
  LFQueue<LogElement> queue_;
  std::atomic<bool> running_ = {true};
  std::thread *logger_thread_ = nullptr;
};
}